// node：18.16.0

let fs = require('fs').promises;
let path = require('path');
let sharp = require('sharp');
// 定义 resizeImage 函数
async function resizeImage(inputPath, outputPath) {
  try {
    // 加载图片并获取原始尺寸
    let metadata = await sharp(inputPath).metadata();
    let { width, height } = metadata;
    // 计算缩放比例
    let maxWidth = 300;
    let maxHeight = 200;
    let newWidth = width;
    let newHeight = height;
    if (width > height && width > maxWidth) {
      // 如果宽度大于高度且超过最大宽度，则按宽度调整
      newWidth = maxWidth;
      newHeight = Math.round((height * maxWidth) / width);
    } else if (height > maxWidth) {
      // 如果高度大于或等于宽度且超过最大高度，则按高度调整
      newHeight = maxHeight;
      newWidth = Math.round((width * maxHeight) / height);
    }
    // 确保新的尺寸不超过目标尺寸
    newWidth = Math.min(newWidth, maxWidth);
    newHeight = Math.min(newHeight, maxHeight);
    // 使用 sharp 进行等比例缩放并保存结果为 PNG 格式
    await sharp(inputPath).resize(newWidth, newHeight, {
      fit: 'inside', // 确保图像不超出指定的最大尺寸
      withoutEnlargement: true, // 不允许放大图像
      kernel: sharp.kernel.lanczos3, // 使用高质量的 Lanczos 插值算法
    }).sharpen() // 应用锐化
      .png({ compressionLevel: 9 }) // 设置 PNG 输出质量
      .toFile(outputPath);
    console.log(`图片已成功缩放并保存至 ${outputPath}`);
  } catch (error) {
    console.error(`处理 ${inputPath} 时发生错误:`, error);
  }
}
// 定义批量处理函数
async function batchProcessImages(directoryPath, outputDirectory) {
  try {
    // 确保输出目录存在
    await fs.mkdir(outputDirectory, { recursive: true });
    // 读取目录内容
    let files = await fs.readdir(directoryPath);
    // 过滤出图片文件（可以根据需要扩展支持更多格式）
    let imageExtensions = ['.jpg', '.jpeg', '.png'];
    let imageFiles = files.filter(file =>
      imageExtensions.some(ext => file.toLowerCase().endsWith(ext)),
    );
    // 对每个图片文件调用 resizeImage
    for (let file of imageFiles) {
      let inputPath = path.join(directoryPath, file);
      let outputFilePath = path.join(outputDirectory, `${path.basename(file, path.extname(file))}.png`);
      await resizeImage(inputPath, outputFilePath);
    }
    console.log('所有图片处理完成！');
  } catch (error) {
    console.error('批量处理过程中发生错误:', error);
  }
}
// 使用示例
let inputDir = './images'; // 输入图片所在的目录
let outputDir = './resized-images'; // 输出处理后的图片的目录
batchProcessImages(inputDir, outputDir);
